#include "MotorColisiones.h"

using namespace TP::Juego::Motorizacion;

MotorColisiones::MotorColisiones() { }

MotorColisiones::~MotorColisiones() { }

Ticks MotorColisiones::notificacionAvanceTiempo(Ticks pTiempo) { }

Partida* MotorColisiones::correrPartida(Partida* pPartida, Ticks pTiempo) {
	// Colisiones Actor x Actor.
	this->computarColisionesActorActor(pPartida);
	// Colisiones Actor x Utilidad.
	this->computarColisionesActorUtilidad(pPartida);
	// Saco los actores muertos.
	this->sacarActoresMuertos(pPartida);
	// Saco las utilidades mueras.
	this->sacarUtilidadesMuertas(pPartida);
	return pPartida;
}

vector<Partida*>& MotorColisiones::getPartidas() {
	return this->_partidas;
}

void MotorColisiones::computarColisionesActorActor(Partida* pPartida) {
	vector<Actor*>& colisionantes = pPartida->ArenaJuego()->getActores();
	vector<Actor*>& colisionados = pPartida->ArenaJuego()->getActores();

	for (vector<Actor*>::iterator colisionantesIt = colisionantes.begin();
			colisionantesIt != colisionantes.end(); ++colisionantesIt)
		for (vector<Actor*>::iterator colisionadosIt = colisionados.begin();
				colisionadosIt != colisionados.end(); ++colisionadosIt)
			((IColisionante*) * colisionantesIt)->colisionar(
					(IColisionado*) * colisionadosIt);
}

void MotorColisiones::computarColisionesActorUtilidad(Partida* pPartida) {
	vector<Actor*>& colisionantes = pPartida->ArenaJuego()->getActores();
	vector<Utilidad*>& colisionados = pPartida->ArenaJuego()->getUtilidades();
	for (vector<Actor*>::iterator colisionantesIt = colisionantes.begin();
			colisionantesIt != colisionantes.end(); ++colisionantesIt) {
		for (vector<Utilidad*>::iterator colisionadosIt = colisionados.begin();
				colisionadosIt != colisionados.end(); ++colisionadosIt) {
			((IColisionante*) * colisionantesIt)->colisionar(
					(IColisionado*) * colisionadosIt);
		}
		((IColisionante*) * colisionantesIt)->colisionar(
				(IColisionado*)pPartida->ArenaJuego()->getPerimetro());
	}
}

void MotorColisiones::sacarActoresMuertos(Partida* pPartida) {
	vector<Actor*>& actores = pPartida->ArenaJuego()->getActores();
	vector<Actor*>::iterator actoresIt = actores.begin();
	while (actoresIt != actores.end()) {
		if ((*(*actoresIt)).destruido()) {
			delete (*actoresIt);
			actoresIt = actores.erase(actoresIt);
		}
		else
			++actoresIt;
	}
}

void MotorColisiones::sacarUtilidadesMuertas(Partida* pPartida) {
	vector<Utilidad*>& utilidades = pPartida->ArenaJuego()->getUtilidades();
	vector<Utilidad*>::iterator utilidadesIt = utilidades.begin();
	while (utilidadesIt != utilidades.end()) {
		if ((*(*utilidadesIt)).destruido()) {
			delete (*utilidadesIt);
			utilidadesIt = utilidades.erase(utilidadesIt);
		}
		else
			++utilidadesIt;
	}
}